package pre.web;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import pre.service.UserService;
import pre.vo.UserVO;

/**  
 * UserService Bean을 이용해 업무를 처리하고 View의 위치를 알려주는 Controller 클래스
 * <p>
 * <b>NOTE</b>: 주로 Service Bean을 가지고 업무를 처리해서 View 위치를 알려주는 곳이다
 * @
 * @  수정일      수정자              수정내용
 * @ ---------   ---------   -------------------------------
 * @ 2013.04.29    ljh       			최초생성
 * @ 2013.04.30    jhm					전체목록 조회 기능 추가		
 * 
 * @author ljh
 * @since 2013. 04.29
 * @version 1.0
 * @see
 * 
 *  Copyright (C) by Daou All right reserved.
 */

@Controller
public class UserController {
	@Resource(name="userService")
	private UserService service;
	
	/*
	 * 메인페이지로 이동한다.
	 */
	@RequestMapping("/mainView.do")
	public String index() throws Exception{
		return "/main";
	}
	
	/*
	 * 회원을 등록하기 위한 폼으로 이동한다. 
	 * @return "/inputInfoUser"
	 * 
	 */
	@RequestMapping("registerUser.do")
	public String inputUserForm() throws Exception{
		return "/inputInfoUser";
	}
	
	/*
	 * 파라미터를 가지고 회원 등록
	 * @param 
	 * @return /inputResultForm
	 */
	@RequestMapping("inputUser.do")
	public String registerUser(@ModelAttribute("userVO")UserVO userVo, Model model) throws Exception{
		String id = userVo.getId();
		System.out.println("inpu : "+id);
		
		try{
			if(id==null || id==""){
				throw new NullPointerException();
			}
			else{
				if(checkEmptyID(id) >0){
					service.registerUser(userVo);
				//	model.addAttribute("user", userVo);
				
				}
				else if(checkEmptyID(id) <0){
					model.addAttribute("message", "이미 등록된 ID 입니다.");
				}
			}
		}catch(NullPointerException e){
			model.addAttribute("message", "ID입력은 필수입니다.");
			System.out.println(e.getMessage());
			e.printStackTrace();
			return "forward:/error.do";
		}
	
		return "/inputResultForm";
	}
	
	/*
	 * 검색창(폼)으로 이동한다.
	 *  @return /searchUser
	 */
	@RequestMapping("/searchUser.do")
	public String searchView(@RequestParam("id")String id, Model model)throws Exception{
		System.out.println(id);
		model.addAttribute("id",id);	
		return "/searchUser";
	}
	
	/*
	 * 넘어온 파라미터를 가지고 개인 회원을 검색한다. 
	 * @param id, model
	 * @return "/oneUserView"
	 * @exception Exception
	 */
	@RequestMapping("/oneUser.do")
	public String selectUserById(@RequestParam("id")String id, Model model) throws ServletException, IOException {
		UserVO user;
		try {
			user = service.selectUserById(id);
			if(user==null){
				throw new NullPointerException();
			}
		}
		
		catch(Exception e) {
			model.addAttribute("message", "찾는 ID가 존재하지 않습니다.");
			System.out.println(e.getMessage());
			e.printStackTrace();
			return "forward:/error.do";
			
			
		}
		user = service.selectUserById(id);
		model.addAttribute("user", user);
		return "/oneUserView";
	}
	
	/*
	 * 모든 회원을 검색한다.
	 * @return "/allUserView"
	 * @exception Exception
	 *  
	 */
	@RequestMapping("/allUser.do")
	public String selectUserList(Model model){
		ArrayList<UserVO> list = new ArrayList<UserVO>();
		try{
			list = service.selectUserList();
			if(list.isEmpty()){ //회원이 존재하지 않는 경우
				throw new NullPointerException();
			}
		}catch(Exception e){
			model.addAttribute("message","회원이 존재하지 않습니다.");
			System.out.println(e.getMessage());
			e.printStackTrace();
			return "forward:/error.do";
		}
		System.out.println("*******************************");
		model.addAttribute("selectUserList",list);
		return "/allUserView";		
	}
	/*
	 * 회원정보를 수정하기 위해 user정보를 가지고 폼으로 이동한다. 
	 * @param model
	 * @return "/modifyUserForm"
	 * @exception Exception
	 */
	@RequestMapping("/modifyUserForm.do")
	public String modifyUser(@RequestParam("id")String id, Model model){
		
		UserVO user = new UserVO();
		
		try{
		user = service.selectUserById(id);
		if(user==null){//수정할 아이디가 찾지 못했을때
			throw new NullPointerException();
			}
		} catch (Exception e) {
			model.addAttribute("message", "수정할 ID가 존재하지 않습니다.");
			System.out.println(e.getMessage());
			e.printStackTrace();
			return "forward:/error.do";
		}
		model.addAttribute("user", user);
		return "/modifyUserForm";
	}
	
	@RequestMapping("/modifyUser.do")
	public String modifyUserForm(@ModelAttribute("UserVO")UserVO userVo, Model model) throws Exception{
		
		UserVO userVO = service.updateUser(userVo);
		model.addAttribute("user", userVO);
		model.addAttribute("message", "수정이 완료되었습니다.");
		return "/oneUserView";
	}
	
	/*
	 * 회원을 제거한다.
	 * @param model
	 * @return "/deleteUserResult"
	 * @exception Exception
	 */
	@RequestMapping("removeUser.do")
	public String removeUser(@RequestParam("id")String id, Model model) throws Exception{
		try{
		System.out.println(id);
		
		if(service.selectUserById(id)==null){
			throw new NullPointerException();
		}
		service.removeUser(id);
		}
		catch(Exception e){
			model.addAttribute("message", "삭제할 ID가 존재하지 않습니다.");
			System.out.println(e.getMessage());
			e.printStackTrace();
			return "forward:/error.do";
		}
		
		model.addAttribute("id", id);
		return "/deleteUserResult";
	}
	
	public int checkEmptyID(String id) throws Exception{
		int num = 0;
		
		UserVO user= service.selectUserById(id);
		//등록된 ID 가 없으므로 등록 가능
		if(user==null || user.equals(null)){
			num = 1;
		}
		//등록된 ID가 있으므로 등록 불가능
		else if(user !=null){
			num = -1;
		}
		return num;
	}
	
	/*
	 * 에러페이지로 이동한다.
	 */
	@RequestMapping("/error.do")
	public String errorPage(){
		return "/error";
	}
}
